将节点容器运行时从Docker迁移到containerd

Kubernetes 1.24不再支持将Docker作为内置容器运行时,Dockershim组件也将在1.24版本中被正式移除。这意味着kubelet将无法与Docker进行交互完成容器的创建和管理操作。为此,ACK也将在1.24及更高版本中不再支持将Docker作为内置容器运行时。为了将ACK升级到1.24及更高版本,您需要将节点容器运行时从Docker迁移到containerd。

Containerd容器运行时是Kubernetes支持的行业标准容器运行时,与Docker运行时相比,containerd具有启动速度更快、更省资源且更安全的优势。

Docker迁移到containerd升级方案

重要

升级前,请确认工作负载不依赖于节点Docker进行镜像构建工作。一般情况下,您的工作负载不依赖于容器运行时,且Docker本身的后端也是调用的containerd。因此,理论上在完成迁移后,您的工作负载将不受影响。

建议先进行测试环境迁移,然后在业务低峰期进行生产环境迁移。

将节点容器运行时从Docker迁移到containerd可以通过以下两种方案实现。

方案一:原节点池操作升级(推荐)

通过节点池页面的Kubelet 升级功能完成Dockercontainerd的迁移。此方案会自动替换节点系统盘,请勿在系统盘中保存重要数据,或提前做好备份工作。数据盘在升级过程中则不受影响。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 节点池页面,选择目标节点池,选择更多>Kubelet 升级

  4. 选择运行时升级,单击前置检查,前置检查通过后,按照页面提示完成运行时的升级。

方案二:新建containerd节点池轮转迁移(可选)

新建一个节点池,运行时选择containerd,扩容节点。通过设置老节点池禁止调度或者更新应用负载指定节点池调度的方式(例如Label),逐步将应用全部迁移至新的节点池,再将旧节点池进行下线处理。

关于如何创建节点池,请参见创建和管理节点池;关于如何将节点设置为不可调度,请参见节点排水和调度状态

迁移后注意事项

  • 迁移后,Dockerfile的主要语法保持不变,但请关注与运行时环境相关的配置,例如基础镜像的兼容性、环境变量的设置和运行时命令的定义,以确保镜像在containerd环境下能够顺利构建和运行。

  • 由于containerd本身不具有镜像构建的功能,因此在完成升级后,您将在集群节点上无法使用Docker Build进行镜像构建,但镜像的拉取不受影响。

  • 将容器运行时迁移到containerd后,Docker将不再作为容器生命周期的管理者。因此,在完成迁移后您将无法在节点上使用Docker命令或Docker API查看容器状态或与容器进行交互。但是你依然可以使用containerd命令代替Docker命令,关于containerd的命令与Docker命令映射关系,请参见containerd、安全沙箱、Docker运行时的对比

替盘升级原理介绍

ACK会自动按照以下流程执行替盘升级完成Dockercontainerd迁移操作。

  1. 执行节点排水(并设置节点为不可调度)。

  2. ECS关机,即停止节点。

  3. 更换系统盘, 系统盘ID会变更,但是云盘类型、实例IP地址以及弹性网卡MAC地址保持不变。

  4. 重新初始化节点安装containerd运行时。

  5. 重启节点,节点就绪(设置节点为可调度)。

image

常见问题

每个批次升级大概需要多长时间?

通过节点池升级页面将Docker迁移到containerd,采用的是替盘升级方式。如果不涉及快照,一般是8min内。如果在升级时选中快照,升级会在快照结束后执行,执行时间取决于快照时间。节点池升级容忍快照40min,如果40min内快照还未结束会判定节点超时失败,失败的节点此时还未开始执行升级操作。如果没有在系统盘中保存业务数据,可以不选中快照,避免升级用时过久。

每个批次的升级节点数为:1、2、4、8……直至达到最大并行数,达到最大并行数后,每个批次都按最大并行数的节点进行升级。例如每批次执行最多节点数设置为4,那么第一批升级的节点个数为1,第二批升级的节点个数为2,第三批升级的节点个数为4,以后每批的升级节点个数均为4。

升级过程业务是否受影响?

通过节点池升级页面将Docker迁移到containerd,采用的是替盘升级方式。替盘升级时会对节点排水,如果Pod实现了优雅退出逻辑(Graceful shutdown and zero downtime deployments in Kubernetes),并且多副本部署在多个Node上,对业务没有影响。为了避免同一个应用的多个副本都在一个批次内进行升级,可以手动调整并行数小于Pod副本数。

Docker迁移到containerd后,支持回退吗?

不支持回退。

Docker迁移到containerd的过程中,节点数据会丢失吗?

通过节点池升级页面将Docker迁移到containerd,采用的是替盘升级方式。以替换节点系统盘的方式执行节点运行时升级时,请不要在系统盘中保存重要数据或者提前做好备份工作,数据盘在升级过程中则不受影响。

节点替换系统盘后,节点的IP地址会变吗?

替换系统盘, 系统盘ID会变更,但是云盘类型、实例IP地址以及弹性网卡MAC地址保持不变。更多信息,请参见更换系统盘(更换操作系统)

containerdDocker的兼容情况是怎样的?

一般情况下,您的工作负载不依赖于容器运行时,且Docker本身的后端也是调用的containerd,因此,理论上在完成迁移后您的工作负载将不受影响。

由于containerd本身不具有镜像构建的功能,因此在完成升级后,在集群节点上您将无法使用Docker Build进行镜像构建,但镜像的拉取不受影响。

将容器运行时迁移到containerd后,Docker将不再作为容器生命周期的管理者。因此,在完成迁移后您将无法在节点上使用Docker命令或Docker API查看容器状态或与容器进行交互。

如果之前在集群节点上依赖Docker构建了镜像,现在运行时升级为containerd怎么办?

您可以基于阿里云容器镜像服务ACR的产品化能力构建镜像,也可以手动构建镜像。

  • 使用ACR构建(推荐):ACR镜像构建基于Docker官方镜像构建工具BuildKit实现。您可以创建ACR实例,基于Dockerfile文件的构建规则自动触发镜像构建,然后运行Dockerfile执行构建,构建完成后自动提交镜像到容器镜像仓库。具体操作,请参见使用企业版实例构建镜像

  • 手动构建:为保障最佳的节点性能,建议额外创建一台ECS实例,手动安装Docker后使用Docker命令构建镜像。具体操作,请参见安装Docker

节点运行时由Docker切换为containerd后,Docker目录未被清理占用磁盘空间怎么办?

Kubernetes集群可管理的容器、镜像、日志等文件外,Docker目录中也包含您自行创建的文件路径。如无需使用,请在运行时切换后手动删除数据盘中的Docker目录。